package com.ruoyi.pk.service.impl;

import java.util.*;
import java.util.stream.Collectors;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.pk.mapper.PkZlDailyReportMapper;
import com.ruoyi.pk.domain.PkZlDailyReport;
import com.ruoyi.pk.service.IPkZlDailyReportService;

/**
 * 主粮日报Service业务层处理
 *
 * @author wang
 * @date 2021-09-10
 */
@Service
public class PkZlDailyReportServiceImpl implements IPkZlDailyReportService
{
    @Autowired
    private PkZlDailyReportMapper pkZlDailyReportMapper;

    /**
     * 查询主粮日报
     *
     * @param id 主粮日报主键
     * @return 主粮日报
     */
    @Override
    public PkZlDailyReport selectPkZlDailyReportById(Long id)
    {
        return pkZlDailyReportMapper.selectPkZlDailyReportById(id);
    }

    /**
     * 查询主粮日报列表
     *
     * @param pkZlDailyReport 主粮日报
     * @return 主粮日报
     */
    @Override
    public List<PkZlDailyReport> selectPkZlDailyReportList(PkZlDailyReport pkZlDailyReport)
    {
        return pkZlDailyReportMapper.selectPkZlDailyReportList(pkZlDailyReport);
    }

    /**
     * 新增主粮日报
     *
     * @param pkZlDailyReport 主粮日报
     * @return 结果
     */
    @Override
    public int insertPkZlDailyReport(PkZlDailyReport pkZlDailyReport)
    {
        pkZlDailyReport.setPky(SecurityUtils.getUsername());
        return pkZlDailyReportMapper.insertPkZlDailyReport(pkZlDailyReport);
    }

    /**
     * 修改主粮日报
     *
     * @param pkZlDailyReport 主粮日报
     * @return 结果
     */
    @Override
    public int updatePkZlDailyReport(PkZlDailyReport pkZlDailyReport)
    {
        if(pkZlDailyReport.getSftj().equals("2")){//品控班长点击审核结束
            pkZlDailyReport.setPkbz(SecurityUtils.getUsername());
            pkZlDailyReport.setPkbztxsj(new Date());
            pkZlDailyReport.setSftj("2");//表示流转完毕

            //其他审核节点数据设置为"-"
            pkZlDailyReport.setZr("-");
            pkZlDailyReport.setZryj("-");
            //pkZlDailyReport.setZrtxsj(null);
            pkZlDailyReport.setPkjl("-");
            pkZlDailyReport.setPkjlyj("-");
            //pkZlDailyReport.setPkjltxsj(null);
        }else {
            //记录品控班长意见、填写时间
            if (pkZlDailyReport.getPkbzyj() != null && pkZlDailyReport.getZryj() == null && pkZlDailyReport.getPkjlyj() == null) {
                pkZlDailyReport.setPkbztxsj(new Date());
                pkZlDailyReport.setPkbz(SecurityUtils.getUsername());
            }
            //记录主任意见、填写时间
            if (pkZlDailyReport.getPkbzyj() != null && pkZlDailyReport.getZryj() != null && pkZlDailyReport.getPkjlyj() == null) {
                pkZlDailyReport.setZrtxsj(new Date());
                pkZlDailyReport.setZr(SecurityUtils.getUsername());
            }
            //记录品控经理意见、填写时间
            if (pkZlDailyReport.getPkjlyj() != null && pkZlDailyReport.getPkbzyj() != null && pkZlDailyReport.getZryj() != null) {
                pkZlDailyReport.setPkjltxsj(new Date());
                pkZlDailyReport.setPkjl(SecurityUtils.getUsername());
                pkZlDailyReport.setSftj("2");//表示流转完毕
            }
        }
        return pkZlDailyReportMapper.updatePkZlDailyReport(pkZlDailyReport);
    }

    /**
     * 批量删除主粮日报
     *
     * @param ids 需要删除的主粮日报主键
     * @return 结果
     */
    @Override
    public int deletePkZlDailyReportByIds(Long[] ids)
    {
        return pkZlDailyReportMapper.deletePkZlDailyReportByIds(ids);
    }

    /**
     * 删除主粮日报信息
     *
     * @param id 主粮日报主键
     * @return 结果
     */
    @Override
    public int deletePkZlDailyReportById(Long id)
    {
        return pkZlDailyReportMapper.deletePkZlDailyReportById(id);
    }

    @Override
    public List<PkZlDailyReport> getListByBzWtdj(PkZlDailyReport pkZlDailyReport) {
        Date txrq = pkZlDailyReport.getTxrq(); //当前选择的月份
        Date sy = DateUtils.getPreDate(DateUtil.formatDate(txrq));//上个月
        pkZlDailyReport.setTxrq(txrq);//当前选择的月份
        pkZlDailyReport.setPkjltxsj(sy);//上个月
        List<PkZlDailyReport> listByWtlb = pkZlDailyReportMapper.getListByBzWtdj(pkZlDailyReport);
        List<PkZlDailyReport> list = getNewList(listByWtlb, txrq, sy, "bzwtdj");
        return list;
    }

    @Override
    public List<PkZlDailyReport> getListByWtlb(PkZlDailyReport pkZlDailyReport) {
        Date txrq = pkZlDailyReport.getTxrq(); //当前选择的月份
        Date sy = DateUtils.getPreDate(DateUtil.formatDate(txrq));//上个月
        pkZlDailyReport.setTxrq(txrq);//当前选择的月份
        pkZlDailyReport.setPkjltxsj(sy);//上个月
        List<PkZlDailyReport> listByWtlb = pkZlDailyReportMapper.getListByWtlb(pkZlDailyReport);
        List<PkZlDailyReport> list = getNewList(listByWtlb, txrq, sy, "wtlb");
        return list;
    }

    @Override
    public List<PkZlDailyReport> getListByBzSl(PkZlDailyReport pkZlDailyReport) {
        Date txrq = pkZlDailyReport.getTxrq(); //当前选择的月份
        Date sy = DateUtils.getPreDate(DateUtil.formatDate(txrq));//上个月
        pkZlDailyReport.setTxrq(txrq);//当前选择的月份
        pkZlDailyReport.setPkjltxsj(sy);//上个月
        List<PkZlDailyReport> listByBzSl = pkZlDailyReportMapper.getListByBzSl(pkZlDailyReport);
        List<PkZlDailyReport> list = getNewList(listByBzSl, txrq, sy, "bzsl");
        return list;
    }


    public static List<PkZlDailyReport> getNewList(List<PkZlDailyReport> listByCon,Date txrq,Date sy,String f){
        List<PkZlDailyReport> selectDate = listByCon.stream().filter(item -> DateUtil.format(item.getTxrq(), "yyyyMM").equals(DateUtil.format(txrq, "yyyyMM"))).collect(Collectors.toList());
        List<PkZlDailyReport> shangyueDate = listByCon.stream().filter(item -> DateUtil.format(item.getTxrq(), "yyyyMM").equals(DateUtil.format(sy, "yyyyMM"))).collect(Collectors.toList());

        List<String> strList;
        List<PkZlDailyReport> list = new ArrayList<>();
        //获取去重后，所有的班组
        if(f.equals("bzsl")){
            strList = listByCon.stream().map(PkZlDailyReport::getBz).distinct().collect(Collectors.toList());
            strList.forEach(item -> {
                PkZlDailyReport zl = new PkZlDailyReport();
                zl.setBz(item);
                shangyueDate.forEach(it -> {
                    if(it.getBz().equals(item)){ zl.setCq(it.getCq());} //上月的次数
                });
                selectDate.forEach(it -> {
                    if(it.getBz().equals(item)){ zl.setZr(it.getCq());} //选择月的次数
                });
                list.add(zl);
            });
        }
        //获取去重后，所有的问题类别
        if(f.equals("wtlb")){
            strList = listByCon.stream().map(PkZlDailyReport::getWtlb).distinct().collect(Collectors.toList());
            strList.forEach(item -> {
                PkZlDailyReport zl = new PkZlDailyReport();
                zl.setWtlb(item);
                shangyueDate.forEach(it -> {
                    if(it.getWtlb().equals(item)){ zl.setCq(it.getCq());} //上月的次数
                });
                selectDate.forEach(it -> {
                    if(it.getWtlb().equals(item)){ zl.setZr(it.getCq());} //选择月的次数
                });
                list.add(zl);
            });
        }
        //获取去重后，所有的班组、问题等级
        List<PkZlDailyReport> bzAndWtdjList = new ArrayList<>();
        if(f.equals("bzwtdj")){
            //bzAndWtdjList = listByCon.stream().collect( Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o->o.getBz()+ ";" + o.getWtdj()))), ArrayList::new));
            strList = listByCon.stream().map(PkZlDailyReport::getBz).distinct().collect(Collectors.toList());
            strList.forEach(item -> {
                PkZlDailyReport zl = new PkZlDailyReport();
                zl.setBz(item);
                shangyueDate.forEach(it -> {
                    if(it.getBz().equals(item)){
                        if(it.getWtdj().equals("A")){
                            zl.setCq(it.getCq());
                        }
                        if(it.getWtdj().equals("B")){
                            zl.setWtlb(it.getCq());
                        }
                        if(it.getWtdj().equals("C")){
                            zl.setPkjl(it.getCq());
                        }
                        if(it.getWtdj().equals("D")){
                            zl.setZryj(it.getCq());
                        }
                        if(it.getWtdj().equals("E")){
                            zl.setHj(it.getCq());
                        }

                    }
                });
                selectDate.forEach(it -> {
                    if(it.getBz().equals(item)){
                        if(it.getWtdj().equals("A")){
                            zl.setZr(it.getCq());
                        }
                        if(it.getWtdj().equals("B")){
                            zl.setGzyz(it.getCq());
                        }
                        if(it.getWtdj().equals("C")){
                            zl.setYgkh(it.getCq());
                        }
                        if(it.getWtdj().equals("D")){
                            zl.setYyfx(it.getCq());
                        }
                        if(it.getWtdj().equals("E")){
                            zl.setJzcs(it.getCq());
                        }

                    }
                });
                list.add(zl);
            });
        }
        return list;
    }

    /*******************
     * 周报统计
     */
    @Override
    public List<PkZlDailyReport> getListByBzSl_Z(PkZlDailyReport pkZlDailyReport) {
        Map<String, Object> params = pkZlDailyReport.getParams();
        String beginTime = params.get("beginTime").toString();//选择的开始时间，默认为本周一
        DateTime szy = DateUtil.offsetDay(DateUtil.parse(beginTime, "yyyy-MM-dd"), -7); //获取上周周一
        DateTime szt = DateUtil.offsetDay(DateUtil.parse(beginTime, "yyyy-MM-dd"), -1); //获取上周周天
        Map<String, Object> sz = new HashMap<>();
        sz.put("beginTime",szy);
        sz.put("endTime",szt);
        PkZlDailyReport szZlDailyReport = new PkZlDailyReport();
        szZlDailyReport.setParams(sz);
        List<PkZlDailyReport> szList = pkZlDailyReportMapper.getListByBzSl_Z(szZlDailyReport);//选择时间段内上一周的数据
        List<PkZlDailyReport> bzList = pkZlDailyReportMapper.getListByBzSl_Z(pkZlDailyReport);//选择时间段内的数据

        //两周的数据
        List<PkZlDailyReport> all = new ArrayList<>();
        all.addAll(szList);
        all.addAll(bzList);
        List<String> collect = all.stream().map(PkZlDailyReport::getBz).distinct().collect(Collectors.toList());//两周的班组数据,已去重
        List<PkZlDailyReport> list = new ArrayList<>();
        collect.forEach(item -> {
            PkZlDailyReport zl = new PkZlDailyReport();
            zl.setBz(item);
            szList.forEach(it -> {
                if(it.getBz().equals(item)){ zl.setCq(it.getCq());} //上周的次数
            });
            bzList.forEach(it -> {
                if(it.getBz().equals(item)){ zl.setZr(it.getCq());} //选择周的次数
            });
            list.add(zl);
        });
        return list;
    }

    @Override
    public List<PkZlDailyReport> getListByWtlb_Z(PkZlDailyReport pkZlDailyReport) {
        Map<String, Object> params = pkZlDailyReport.getParams();
        String beginTime = params.get("beginTime").toString();//选择的开始时间，默认为本周一
        DateTime szy = DateUtil.offsetDay(DateUtil.parse(beginTime, "yyyy-MM-dd"), -7); //获取上周周一
        DateTime szt = DateUtil.offsetDay(DateUtil.parse(beginTime, "yyyy-MM-dd"), -1); //获取上周周天
        Map<String, Object> sz = new HashMap<>();
        sz.put("beginTime",szy);
        sz.put("endTime",szt);
        PkZlDailyReport szZlDailyReport = new PkZlDailyReport();
        szZlDailyReport.setParams(sz);
        List<PkZlDailyReport> szList = pkZlDailyReportMapper.getListByWtlb_Z(szZlDailyReport);//选择时间段内上一周的数据
        List<PkZlDailyReport> bzList = pkZlDailyReportMapper.getListByWtlb_Z(pkZlDailyReport);//选择时间段内的数据

        //两周的数据
        List<PkZlDailyReport> all = new ArrayList<>();
        all.addAll(szList);
        all.addAll(bzList);
        List<String> collect = all.stream().map(PkZlDailyReport::getWtlb).distinct().collect(Collectors.toList());//两周的问题类别数据,已去重
        List<PkZlDailyReport> list = new ArrayList<>();
        collect.forEach(item -> {
            PkZlDailyReport zl = new PkZlDailyReport();
            zl.setWtlb(item);
            szList.forEach(it -> {
                if(it.getWtlb().equals(item)){ zl.setCq(it.getCq());} //上周的次数
            });
            bzList.forEach(it -> {
                if(it.getWtlb().equals(item)){ zl.setZr(it.getCq());} //选择周的次数
            });
            list.add(zl);
        });
        return list;
    }

    @Override
    public List<PkZlDailyReport> getListByBzWtdj_Z(PkZlDailyReport pkZlDailyReport) {
        Map<String, Object> params = pkZlDailyReport.getParams();
        String beginTime = params.get("beginTime").toString();//选择的开始时间，默认为本周一
        DateTime szy = DateUtil.offsetDay(DateUtil.parse(beginTime, "yyyy-MM-dd"), -7); //获取上周周一
        DateTime szt = DateUtil.offsetDay(DateUtil.parse(beginTime, "yyyy-MM-dd"), -1); //获取上周周天
        Map<String, Object> sz = new HashMap<>();
        sz.put("beginTime",szy);
        sz.put("endTime",szt);
        PkZlDailyReport szZlDailyReport = new PkZlDailyReport();
        szZlDailyReport.setParams(sz);
        List<PkZlDailyReport> szList = pkZlDailyReportMapper.getListByBzWtdj_Z(szZlDailyReport);//选择时间段内上一周的数据
        List<PkZlDailyReport> bzList = pkZlDailyReportMapper.getListByBzWtdj_Z(pkZlDailyReport);//选择时间段内的数据

        //两周的数据
        List<PkZlDailyReport> all = new ArrayList<>();
        all.addAll(szList);
        all.addAll(bzList);
        List<String> collect = all.stream().map(PkZlDailyReport::getBz).distinct().collect(Collectors.toList());//两周的班组数据,已去重
        List<PkZlDailyReport> list = new ArrayList<>();
        collect.forEach(item -> {
            PkZlDailyReport zl = new PkZlDailyReport();
            zl.setBz(item);
            szList.forEach(it -> {
                if(it.getBz().equals(item)){
                    if(it.getWtdj().equals("A")){
                        zl.setCq(it.getCq());
                    }
                    if(it.getWtdj().equals("B")){
                        zl.setWtlb(it.getCq());
                    }
                    if(it.getWtdj().equals("C")){
                        zl.setPkjl(it.getCq());
                    }
                    if(it.getWtdj().equals("D")){
                        zl.setZryj(it.getCq());
                    }
                    if(it.getWtdj().equals("E")){
                        zl.setHj(it.getCq());
                    }

                }
            });
            bzList.forEach(it -> {
                if(it.getBz().equals(item)){
                    if(it.getWtdj().equals("A")){
                        zl.setZr(it.getCq());
                    }
                    if(it.getWtdj().equals("B")){
                        zl.setGzyz(it.getCq());
                    }
                    if(it.getWtdj().equals("C")){
                        zl.setYgkh(it.getCq());
                    }
                    if(it.getWtdj().equals("D")){
                        zl.setYyfx(it.getCq());
                    }
                    if(it.getWtdj().equals("E")){
                        zl.setJzcs(it.getCq());
                    }

                }
            });
            list.add(zl);
        });
        return list;
    }
    /*******************/
}
